package com.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.List;

/**
 * @author gali
 * @date 2022/6/5 16:14
 */
public class ProductKill {
    /**
     * 复刻秒杀过程
     */
    public static boolean doSecKill(String uid,String prodId){
        //参数非空判断
        if (uid==null|prodId==null){
            return false;
        }
        //redis连接
        Jedis jedis = new Jedis("192.168.186.128",6379);
        //拼接相关key，库存，秒杀成功用户
        String kcKey="sk:"+prodId+":qt";
        String userKey="sk:"+prodId+":uid";
        //监视库存
        jedis.watch(kcKey);
        //获取库存，如果库存为null，秒杀还未开始
        String s = jedis.get(kcKey);
        if (s==null){
            System.out.println("秒杀还没有开始，请等待");
            jedis.close();
            return false;
        }
        //用户是否重复秒杀
        if (jedis.sismember(userKey, uid)){
            System.out.println("用户已经秒杀过了，不能重复秒杀");
            jedis.close();
            return false;
        }
        //判断商品数量，库存数量小于1，表示秒杀结束
        if (Integer.parseInt(s)<1){
            System.out.println("秒杀结束");
            jedis.close();
            return false;
        }
        //秒杀过程，库存-1，秒杀成功用户添加到清单里面
        //使用事务
        Transaction multi = jedis.multi();
        multi.decr(kcKey);
        multi.sadd(userKey,uid);
        List<Object> exec = multi.exec();
        if (exec==null || exec.size()==0){
            System.out.println("秒杀失败");
            jedis.close();
            return false;
        }
//        jedis.decr(kcKey);
//        jedis.sadd(userKey,uid);
        System.out.println("秒杀成功了...");
        jedis.close();
        return true;
    }

    public static void main(String[] args) {
        doSecKill("01","01");
        doSecKill("02","01");
    }
}
